Android投屏帧率码率

您所在的位置:网站首页 unity 录屏比特率 Android投屏帧率码率

Android投屏帧率码率

2024-02-17 06:36| 来源: 网络整理| 查看: 265

录屏流程:

Display 可以“投影”到一个 VirtualDisplay 通过 MediaProjectionManager 取得的 MediaProjection创建VirtualDisplay VirtualDisplay 会将图像渲染到 Surface中,而这个Surface是由MediaCodec所创建的 MediaMuxer 将从 MediaCodec 得到的图像元数据封装并输出到MP4文件中

SZ流程:

客户端原始帧编码为H264裸流(MediaCodec,Android API) —> 再封装为FLV格式的视频流(Java) —> 按照rtmp流媒体协议通过librtmp(JNI + C)推流到RTMP流媒体服务器 —> 客户端播放器解码观看

pedro流程:

在rtmp模块中,创建视频和音频的RTP数据包,将其封装在flv数据包中,然后发送到服务器。 该库使用MediaCodec Android类进行硬件编码。

帧率控制:

使用MediaProjection / VirtualDisplay 来进行录屏的话,官方并不提供帧率的控制(MediaFormat里面的.setFloat(MediaFormat.KEY_FRAME_RATE, fps);设置后,不准确),这需要用到OpenGL ES将VirtualDisplay中的surface进行绘制到MediaCodec中的surface。

中间加上一个surface作为缓冲,他的作用只能是限制最大帧率,而不能无缘无故增加帧。 比如你在一个静止页面,一秒只有3帧,那么最后也只能输出3帧。

帧是系统的 MediaProjection 丢出来的,屏幕刷新了,就有新的帧丢过来。以多少帧丢出来,是安卓决定的。 比如王者开30帧,那么页面只有30帧每秒丢过来。那么就算我加了opengl的缓存surface,设置输出最大60帧,那么最后也只有30帧的数据。

码率控制:

固定码率视频编码算法是通过利用缓冲器状态改变量化器步长来实现的。当图像细节丰富时,为了确保缓冲器不溢出,就得加大量化步长,减少编码比特数,从而保证输出码流的码率恒定。这是以牺牲视频质量为代价的。因为加大量化步长会损伤图像的高频细节和低频背景,甚至产生“块效应”和图像细节模糊现象。 MediaFormat里面的码率控制,设置的是平均码率



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3